package com.longway.common.interceptor;

import com.jfinal.aop.Interceptor;
import com.jfinal.aop.Invocation;
import com.longway.common.constant.Const;
import com.longway.common.model.BaseUser;
import com.longway.common.service.BusinessService;

/**
 * 后台管理员授权拦截器
 */
public class AdminAuthInterceptor implements Interceptor {

	/**
	 * 用于 sharedObject、sharedMethod 扩展中使用
	 */
	private static final ThreadLocal<BaseUser> threadLocal = new ThreadLocal<BaseUser>();
	
	public static BaseUser getThreadLocalAccount() {
		return threadLocal.get();
	}

	@Override
    public void intercept(Invocation inv) {
		BaseUser loginAccount = inv.getController().getAttr(Const.loginAccountCacheName);
		if (loginAccount != null && loginAccount.isStatusOk()) {
			// 传递给 sharedObject、sharedMethod 扩展使用
			threadLocal.set(loginAccount);
			
			// 如果是超级管理员或者拥有对当前 action 的访问权限则放行
			if (BusinessService.me.isExculeUrl(inv.getActionKey())||BusinessService.me.isSuperAdmin(loginAccount.getId()) ||BusinessService.me.hasPermission(loginAccount.getRoleId(), inv.getActionKey())) {
				inv.invoke();
				return ;
			}
		}

		// renderError(404) 避免暴露后台管理 url，增加安全性
		/*if (loginAccount == null || inv.getActionKey().equals("/admin")) {
			inv.getController().renderError(404);
		}*/
		// renderJson 提示没有操作权限，提升用户体验
		/*else {
			inv.getController().renderJson(Ret.fail("msg", "没有操作权限"));
		}*/
		inv.getController().renderError(403);
	}
}

